简述一下 C++的重载和重写,以及它们的区别和实现方式

4 分钟阅读 874 字 + 298 词
参考答案
  1. 重载和重写是两种不同的概念,它们都用于实现多态性,但方式和使用场景有所不同
  2. 重载:在同一个类或命名空间中,声明多个 同名函数 , 但是 参数列表不同 编译器根据参数的类型、数量或顺序来区分不同的函数。
  3. 重写: 重写发生在继承体系中,在子类中,声明一个与父类中虚函数具有相同名称、相同参数列表和相同返回类型的函数,并在子类函数前加上 override 关键字。
  4. 区别:
  • 作用域: 重载发生在同一个作用域内,而重写发生在继承体系中。
  • 参数列表:对于 重载的函数,参数列表必须不同 ;对于重写的函数, 参数列表必须与被重写的函数完全相同
  • 返回类型: 重载函数的返回类型可以不同,但重写函数的返回类型必须与被重写的函数相同 (或与之兼容,C++中称为协变返回类型)。
  • 虚函数:重写通常与虚函数一起使用,以实现 运行时多态性 ;而重载是 编译时多态性 ,由编译器在编译期间确定调用哪个函数。
  • 关键字:重写函数可以使用 override 关键字,明确指出该函数是对父类虚函数的重写。
    1.重载 重载是在同一个作用域中允许有多个同名的函数,而这些函数的参数列表不同, 允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数 的不同列表将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数, 来实现同名函数调用时的重载问题。重载没有体现多态性。 2.隐藏 隐藏是指派生类的函数屏蔽了与其同名的基类函数。隐藏规则如下: 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆,重载是在同一个类中发生) 。如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆,覆盖有virtual 关键字)。 3.覆盖 覆盖又可以叫做重写,只有重写了虚函数的才能算作是体现了C++多态性。 基类存在某个虚函数,在派生类中对该虚函数保持返回类型不变,参数类型个数 不变,函数名字也不变,然后对函数体进行修改,这就叫覆盖。被覆盖的函数必须 是虚函数。 4.区别 重载最好区分,重载是在一个作用域(类)中 隐藏和覆盖都是在派生类和基类之间产生,被覆盖的函数一定是虚函数,但是 被隐藏的函数不一定是虚函数, 1、基类的函数无论是不是虚函数,在派生类中的函数与基类函数同名,但是参 数不同,基类函数将被隐藏。 2、基类函数此时不是虚函数,在派生类中的函数与基函数同名并且参数相同, 此时基类函数将被隐藏。